#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int DataType;

// 带头双向循环链表 (最优链表）
typedef struct ListNode
{
	DataType data;
	struct ListNode* next;
	struct ListNode* prev;
}ListNode;

// 接口
ListNode* CreateNode(DataType x); // new一个新节点
ListNode* ListInit(ListNode* phead); // 初始化
void ListPushBack(ListNode* phead, DataType val); // 尾插
void ListPopBack(ListNode* phead); // 尾删
void ListPushFront(ListNode* phead, DataType val); // 头插
void ListdPopFront(ListNode* phead); // 头删
void ListPrint(ListNode* phead); // 打印链表
ListNode* ListFind(ListNode* phead, DataType x);// 
// ----------------------------------------------------------------
void ListInsert(ListNode* pos, DataType x);  // 在任意位置前插入
void ListErease(ListNode* pos);	// 在pos位置删除
// ----------------------------------------------------------------
void ListDistory(ListNode* phead); // 回收链表